#include "funciones.h"
/** Según el dorsal cada defensa tendrá una posición y acturá en consecuencia.
  * Dorsal 2 --> Lateral Derecho
  * Dorsal 3 --> Central Derecho
  * Dorsal 4 --> Central Izquierdo
  * Dorsal 5 --> Lateral Izquierdo */

void posicionInicial(Jugador &jugador)
{
    switch (jugador.getnumero())
    {
    case 2:  //LATERAL DERECHO
    {
        jugador.colocar(-27,25);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.girar(-15);
        jugador.cliente.enviar(jugador.msg.str());
        cout<<"Posicion inicial: ";
        jugador.pos_inicial.setX(-27);
        jugador.pos_inicial.setY(25);
        jugador.pos_inicial.printPunto();
        break;
    }
    case 3:  //CENTRAL DERECHO
    {
        jugador.colocar(-30,8);
        jugador.cliente.enviar(jugador.msg.str());
        cout<<"Posicion inicial: ";
        jugador.pos_inicial.setX(-30);
        jugador.pos_inicial.setY(8);
        jugador.pos_inicial.printPunto();
        break;
    }
    case 4:  //CENTRAL IZQUIERDO
    {
        jugador.colocar(-30,-8);
        jugador.cliente.enviar(jugador.msg.str());
        cout<<"Posicion inicial: ";
        jugador.pos_inicial.setX(-30);
        jugador.pos_inicial.setY(-8);
        jugador.pos_inicial.printPunto();
        break;
    }
    case 5:  //LATERAL IZQUIERDO
    {
        jugador.colocar(-27,-25);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.girar(15);
        jugador.cliente.enviar(jugador.msg.str());
        cout<<"Posicion inicial: ";
        jugador.pos_inicial.setX(-27);
        jugador.pos_inicial.setY(-25);
        jugador.pos_inicial.printPunto();
        break;
    }
    case 6:  //MEDIO DERECHO
    {
        jugador.colocar(-13,32);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.girar(-20);
        jugador.cliente.enviar(jugador.msg.str());
        cout<<"Posicion inicial: ";
        jugador.pos_inicial.setX(-13);
        jugador.pos_inicial.setY(32);
        jugador.pos_inicial.printPunto();
        break;
    }
    case 7: //MEDIOCENTRO DERECHO
    {
        jugador.colocar(-20,6);
        jugador.cliente.enviar(jugador.msg.str());
        cout<<"Posicion inicial: ";
        jugador.pos_inicial.setX(-20);
        jugador.pos_inicial.setY(6);
        jugador.pos_inicial.printPunto();
        break;
    }
    case 8: //MEDIOCENTRO IZQUIERDO
    {
        jugador.colocar(-20,-6);
        jugador.cliente.enviar(jugador.msg.str());
        cout<<"Posicion inicial: ";
        jugador.pos_inicial.setX(-20);
        jugador.pos_inicial.setY(-6);
        jugador.pos_inicial.printPunto();
        break;
    }
    case 9: //MEDIO IZQUIERDO
    {
        jugador.colocar(-13,-32);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.girar(20);
        jugador.cliente.enviar(jugador.msg.str());
        cout<<"Posicion inicial: ";
        jugador.pos_inicial.setX(-13);
        jugador.pos_inicial.setY(32);
        jugador.pos_inicial.printPunto();
        break;
    }
    case 10: //DELANTERO DERECHO
    {
        jugador.colocar(-2,-11);
        jugador.cliente.enviar(jugador.msg.str());
        cout<<"Posicion inicial: ";
        jugador.girar(50);
        jugador.pos_inicial.setX(-2);
        jugador.pos_inicial.setY(-11);
        jugador.pos_inicial.printPunto();
        break;
    }
    case 11: //DELANTERO IZQUIERDO
    {
        jugador.colocar(-2,11);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.girar(-50);
        jugador.cliente.enviar(jugador.msg.str());
        cout<<"Posicion inicial: ";
        jugador.pos_inicial.setX(-2);
        jugador.pos_inicial.setY(11);
        jugador.pos_inicial.printPunto();
        break;
    }
    }
}

/** Xmax=52,5 Ymax=34  */
bool zonaJugador(Jugador &jugador)
{
    bool in = true;
    double x = jugador.posicion.getX();
    double y = jugador.posicion.getY();
    switch (jugador.getnumero())
    {
    case 2:
        if ((-52.5 < x < -25) && (0 < y < 34))
            in = true;
        else
        {
            if((-25 <= x < 10) && (20 < y < 34))
                in = true;
            else
                in = false;
        }
        break;
    case 3:
        if ((-52.5 < x < 0) && (0 < y < 20))
            in = true;
        else
            in = false;
        break;
    case 4:
        if ((-52.5 < x < 0) && (0 < y < -20))
            in = true;
        else
            in = false;
        break;
    case 5:
        if ((-52.5 < x < -25) && (0 < y < -34))
            in = true;
        else
        {
            if((-25 <= x < 10) && (-20 < y < -34))
                in = true;
            else
                in = false;
        }
        break;
    case 6:
        if ((-30 < x < 30) && (0 < y < 34))
            in = true;
        else
        {
            if((30 <= x < 52.5) && (10 < y < 34))
                in = true;
            else
                in = false;
        }
        break;
    case 7:
        if ((-30 < x < 30) && (0 < y < 20))
            in = true;
        else
            in = false;
        break;
    case 8:
        if ((-30 < x < 30) && (-20 < y < 0))
            in = true;
        else
            in = false;
        break;
    case 9:
        if ((-30 < x < 30) && (-34 < y < 0))
            in = true;
        else
        {
            if((30 <= x < 52.5) && (-34 < y < -10))
                in = true;
            else
                in = false;
        }
        break;
    case 10:
        if ((20 < x < 52.5) && (-10 < y < 34))
            in = true;
        else
            in = false;
        break;
    case 11:
        if ((20 < x < 52.5) && (-34 < y < 10))
            in = true;
        else
            in = false;
        break;
    }
    return in;
}

/** En función del aréa que tiene delimitada cada jugador para moverse observamos si la pelota está en dentro de esta.
  * Le añadimos un error de +-2 metros para compensar el error producido por el calculo de la posicion y así poder
  * tambien este área para realizar los saque de banda y corner utilizar*/

bool balonZonaJugador(Jugador &jugador, Punto balon)
{
    bool in = true;
    double x = balon.getX();
    double y = balon.getY();
    switch (jugador.getnumero())
    {
    case 2:
        if ((-54.5 < x < -27) && (-2 < y < 36))
            in = true;
        else
        {
            if((-27 <= x < 12) && (18 < y < 36))
                in = true;
            else
                in = false;
        }
        break;
    case 3:
        if ((-54.5 < x < 2) && (-2 < y < 22))
            in = true;
        else
            in = false;
        break;
    case 4:
        if ((-54.5 < x < 2) && (-2 < y < -22))
            in = true;
        else
            in = false;
        break;
    case 5:
        if ((-54.5 < x < -27) && (-2 < y < -32))
            in = true;
        else
        {
            if((-27 <= x < 12) && (-22 < y < -32))
                in = true;
            else
                in = false;
        }
        break;
    case 6:
        if ((-32 < x < 32) && (-2 < y < 36))
            in = true;
        else
        {
            if((28 <= x < 54.5) && (8 < y < 36))
                in = true;
            else
                in = false;
        }
        break;
    case 7:
        if ((-32 < x < 32) && (-2 < y < 22))
            in = true;
        else
            in = false;
        break;
    case 8:
        if ((-32 < x < 32) && (-22 < y < 2))
            in = true;
        else
            in = false;
        break;
    case 9:
        if ((-32 < x < 32) && (-36 < y < 2))
            in = true;
        else
        {
            if((28 <= x < 54.5) && (-32 < y < -8))
                in = true;
            else
                in = false;
        }
        break;
    case 10:
        if ((18 < x < 54.5) && (-12 < y < 36))
            in = true;
        else
            in = false;
        break;
    case 11:
        if ((18 < x < 54.5) && (-36 < y < 12))
            in = true;
        else
            in = false;
        break;
    }
    return in;
}

void volverZonaJugador(Jugador &jugador)
{

    jugador.goTo(jugador.pos_inicial);

}

Punto posicionPelota(Jugador &jugador)
{
    double x,y,angle;
    Punto pos;
    angle = (jugador.datos.Seeinst["ball"].getDir()*3.141592/180) - jugador.getalpha();
    x = jugador.posicion.getX()+ (jugador.datos.Seeinst["ball"].getDist()*cos(angle));
    y = jugador.posicion.getY()+ (jugador.datos.Seeinst["ball"].getDist()*sin(angle));
    pos.setX(x);
    pos.setY(y);
    return pos;
}

/** Con esta función colocaremos a los jugadores tras cada evento inidicado por el arbitro */
void colocarJugador(Jugador &jugador)
{
    Punto posBalon;
    posBalon = posicionPelota(jugador);
    double x = posBalon.getX();
    double y = posBalon.getY();
    double posInicialX = jugador.pos_inicial.getX();
    double posInicialY = jugador.pos_inicial.getY();
    if (jugador.hearReferee() == 3) //Nuestro equipo saca de banda
    {
        switch (jugador.getnumero())
        {
        case 2:
            if (balonZonaJugador(jugador,posBalon))
                jugador.colocar(x,y);
            else
            {
                if(y > 0)
                    jugador.colocar(0,30);
                else
                    jugador.colocar(-10,20);
            }
            break;
        case 3:
            if(x > 0)
                jugador.colocar(posInicialX+10,posInicialY+10);
            else
                jugador.colocar(posInicialX,posInicialY);
            break;
        case 4:
            if(x > 0)
                jugador.colocar(posInicialX+10,posInicialY+10);
            else
                jugador.colocar(posInicialX,posInicialY);
            break;
            break;
        case 5:
            if (balonZonaJugador(jugador,posBalon))
                jugador.colocar(x,y);
            else
            {
                if(y > 0)
                    jugador.colocar(0,-30);
                else
                    jugador.colocar(-10,-20);
            }
            break;
        case 6:
            if ((balonZonaJugador(jugador,posBalon) == true) && (x > 11))
                jugador.colocar(posBalon.getX(),posBalon.getY());
            else
            {
                if(10 < x)
                    jugador.colocar(x+7,y-3);
                if(y < 0)
                    jugador.colocar(posInicialX,posInicialY);
            }
            break;
        case 7:
            if(x > 0 && y > 0)
                jugador.colocar(x-4,y-5);
            else
                jugador.colocar(x-10,posInicialY);
            break;
        case 8:
            if(x > 0 && y < 0)
                jugador.colocar(x-4,y-5);
            else
                jugador.colocar(x-10,posInicialY);
            break;
        case 9:
            if ((balonZonaJugador(jugador,posBalon) == true) && (x > 11))
                jugador.colocar(x,y);
            else
            {
                if(10 < x)
                    jugador.colocar(x+7,y+3);
                if(y > 0)
                    jugador.colocar(posInicialX,posInicialY);
            }
            break;
        case 10:
            if(x > 0 && y > 0)
                jugador.colocar(x+4,y-5);
            else
                jugador.colocar(posInicialX,posInicialY);
            break;
        case 11:
            if(x > 0 && y < 0)
                jugador.colocar(x+4,y+5);
            else
                jugador.colocar(posInicialX,posInicialY);
            break;
        }
    }

    if (jugador.hearReferee() == 4) //Contrario saca de banda
    {
        switch (jugador.getnumero())
        {
        case 2:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 3:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 4:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 5:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 6:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 7:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 8:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 9:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 10:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 11:
            jugador.colocar(posInicialX,posInicialY);
            break;
        }
    }

    if (jugador.hearReferee() == 5) //Nuestro equipo saca falta
    {
        switch (jugador.getnumero())
        {
        case 2:
            if (balonZonaJugador(jugador,posBalon))
                jugador.colocar(x-2,y+1);
            else
            {
                if(y > 0)
                    jugador.colocar(0,30);
                else
                    jugador.colocar(-10,20);
            }
            break;
        case 3:
            if(balonZonaJugador(jugador,posBalon))
                jugador.colocar(posInicialX,posInicialY);
            else
                jugador.colocar(0,posInicialY);
            break;
        case 4:
            if(balonZonaJugador(jugador,posBalon))
                jugador.colocar(posInicialX,posInicialY);
            else
                jugador.colocar(0,posInicialY);
            break;
        case 5:
            if (balonZonaJugador(jugador,posBalon))
                jugador.colocar(x-2,y-1);
            else
            {
                if(posBalon.getY() < 0)
                    jugador.colocar(0,-30);
                else
                    jugador.colocar(-10,-20);
            }
            break;
        case 6:
            if (balonZonaJugador(jugador,posBalon))
            {
                if (x > 11)
                    jugador.colocar(x-2,y+1);
                if (-25 < x < 11 && y < 20)
                    jugador.colocar(x-2,y+1);
            }
            else
            {
                if(10 < x)
                    jugador.colocar(x+7,y+3);
                if(posBalon.getY() < 0)
                    jugador.colocar(posInicialX,posInicialY);
            }
            break;
        case 7:
            if(posBalon.getX() > 0 && posBalon.getY() > 0)
                jugador.colocar(x-4,y-5);
            else
                jugador.colocar(x-10,posInicialY);
            break;
        case 8:
            if(x > 0 && y < 0)
                jugador.colocar(x-4,y-5);
            else
                jugador.colocar(x-10,posInicialY);
            break;
        case 9:
            if (balonZonaJugador(jugador,posBalon))
            {
                if (x > 11)
                    jugador.colocar(x-2,y-1);
                if (-25 < x < 11 && y > -20)
                    jugador.colocar(x-2,y-1);
            }
            else
            {
                if(10 < x)
                    jugador.colocar(x+7,y+3);
                if(x > 0)
                    jugador.colocar(posInicialX,posInicialY);
            }
        case 10:
            if(x > 0 && y > 0)
                jugador.colocar(x+10,y+5);
            else
                jugador.colocar(posInicialX,posInicialY);
            break;
        case 11:
            if(x > 0 && y < 0)
                jugador.colocar(x+10,y-5);
            else
                jugador.colocar(posInicialX,posInicialY);
            break;
        }
    }

    if (jugador.hearReferee() == 6) //Contrario saca falta
    {
        switch (jugador.getnumero())
        {
        case 2:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 3:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 4:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 5:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 6:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 7:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 8:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 9:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 10:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 11:
            jugador.colocar(posInicialX,posInicialY);
            break;
        }
    }

    if (jugador.hearReferee() == 7) //Nuestro equipo saca corner
    {
        switch (jugador.getnumero())
        {
        case 2:
            jugador.colocar(0,15);
            break;
        case 3:
            jugador.colocar(-3,5);
            break;
        case 4:
            jugador.colocar(-3,-5);
            break;
        case 5:
            jugador.colocar(0,-15);
            break;
        case 6:
            if(y > 0)
                jugador.colocar(x,y+1);
            else
                jugador.colocar(48,5);
            break;
        case 7:
            jugador.colocar(41.5,0);
        case 8:
            jugador.colocar(15,0);
            break;
        case 9:
            if(y < 0)
                jugador.colocar(x,y-1);
            else
                jugador.colocar(48,-5);
            break;
        case 10:
            jugador.colocar(49,5.5);
            break;
        case 11:
            jugador.colocar(50,8);
            break;
        }
    }

    if (jugador.hearReferee() == 8) //Contrario saca corner
    {
        switch (jugador.getnumero())
        {
        case 2:
            jugador.colocar(-50, 2);
            break;
        case 3:
            jugador.colocar(-48,5);
            break;
        case 4:
            jugador.colocar(-48,-5);
            break;
        case 5:
            jugador.colocar(-50,-2);
            break;
        case 6:
            jugador.colocar(-40,1.5);
            break;
        case 7:
            jugador.colocar(-48,1);
            break;
        case 8:
            jugador.colocar(-48,-1);
            break;
        case 9:
            jugador.colocar(-40,-1.5);
            break;
        case 10:
            jugador.colocar(-35,0);
            break;
        case 11:
            jugador.colocar(-15,0);
            break;
        }
    }

    if (jugador.hearReferee() == 9) //Nuestro equipo saca de puerta
    {
        switch (jugador.getnumero())
        {
        case 2:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 3:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 4:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 5:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 6:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 7:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 8:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 9:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 10:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 11:
            jugador.colocar(posInicialX,posInicialY);
            break;
        }
    }

    if (jugador.hearReferee() == 10) //Equipo contrario saca de puerta
    {
        switch (jugador.getnumero())
        {
        case 2:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 3:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 4:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 5:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 6:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 7:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 8:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 9:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 10:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 11:
            jugador.colocar(posInicialX,posInicialY);
            break;
        }
    }

    if (jugador.hearReferee() == 11) //GOOOOL
    {
        switch (jugador.getnumero())
        {
        case 2:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 3:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 4:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 5:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 6:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 7:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 8:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 9:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 10:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 11:
            jugador.colocar(posInicialX,posInicialY);
            break;
        }
    }

    if (jugador.hearReferee() == 12) //Nuestro equipo saca offside
    {
        switch (jugador.getnumero())
        {
        case 2:
            if(y > 0)
                jugador.colocar(x,y);
            else
                jugador.colocar(posInicialX,posInicialY);
            break;
        case 3:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 4:
            jugador.colocar(posInicialX,posInicialY);
        case 5:
            if(y < 0)
                jugador.colocar(x,y);
            else
                jugador.colocar(posInicialX,posInicialY);
            break;
        case 6:
            jugador.colocar(posInicialX+5,posInicialY);
            break;
        case 7:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 8:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 9:
            jugador.colocar(posInicialX+5,posInicialY);
            break;
        case 10:
            jugador.colocar(posInicialX+5,posInicialY);
            break;
        case 11:
            jugador.colocar(posInicialX+5,posInicialY);
            break;
        }
    }

    if (jugador.hearReferee() == 13) //Equipo contrario saca offside
    {
        switch (jugador.getnumero())
        {
        case 2:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 3:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 4:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 5:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 6:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 7:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 8:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 9:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 10:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 11:
            jugador.colocar(posInicialX,posInicialY);
            break;
        }
    }

    if (jugador.hearReferee() == 14) //Half time
    {
        switch (jugador.getnumero())
        {
        case 2:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 3:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 4:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 5:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 6:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 7:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 8:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 9:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 10:
            jugador.colocar(posInicialX,posInicialY);
            break;
        case 11:
            jugador.colocar(posInicialX,posInicialY);
            break;
        }
    }
}
